home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / tcppack / tcppackb.lzh / src / samples / arp.c next >
C/C++ Source or Header  |  1994-08-17  |  6KB  |  307 lines

  1. /*
  2.  * arp.c
  3.  *
  4.  * Copyright (C) 1994 Tomoaki Tada/F.C.T.
  5.  */
  6.  
  7. static char *rcsid = "$Id: arp.c,v 1.6 1994/08/17 09:54:31 Niggle Exp $";
  8.  
  9. /*
  10.  * $Log: arp.c,v $
  11.  * Revision 1.6  1994/08/17  09:54:31  Niggle
  12.  * correct spell miss.
  13.  *
  14.  * Revision 1.5  1994/08/04  05:00:48  Niggle
  15.  * inetdé¬ÅφÆôé╡é─éóé╚éóÅΩìçé╠ò\Īé≡ò╧ìX
  16.  *
  17.  * Revision 1.4  1994/08/03  01:57:27  Niggle
  18.  * alias é≡Ägùpé╖éΘé╠é≡éΓé▀é─üCnameé⌐éτdomain nameé≡Å£éóé╜éαé╠é≡Ägéñéµéñò╧ìX
  19.  *
  20.  * Revision 1.3  1994/07/19  03:32:50  Niggle
  21.  * gethostbyname()ôÖé≡Ägùpé╖éΘéµéñé╔ò╧ìX
  22.  *
  23.  * Revision 1.2  1994/05/13  05:44:13  Niggle
  24.  * chenged to be able to handle hardware addresses, that is not ethernet address.
  25.  *
  26.  * Revision 1.1  1994/05/10  09:21:14  Niggle
  27.  * Initial revision
  28.  *
  29.  */
  30.  
  31. #include<stdio.h>
  32. #include<string.h>
  33. #include<stdlib.h>
  34.  
  35. #include"network.h"
  36. #include"socket.h"
  37.  
  38. static void display_all_table (void);
  39. static void add_a_table (char *, char *);
  40. static void delete_a_table (char *);
  41. static void print_a_table (char *);
  42.  
  43. /************************************************
  44.  *                        *
  45.  ************************************************/
  46. void
  47. main (int argc, char **argv)
  48. {
  49.   long version = _get_version ();
  50.  
  51.   if (version == -1)
  52.     fprintf (stderr, "TCP/IP driveré═ÅφÆôé╡é─éóé▄é╣é±\n");
  53.   else
  54.     {
  55.       int c;
  56.  
  57.       opterr = 1;
  58.       c = getopt (argc, argv, "asd:f:");
  59.       if (c != EOF)
  60.     {
  61.       switch (c)
  62.         {
  63.         case 'a':
  64.           /* display all table */
  65.           display_all_table ();
  66.           break;
  67.         case 's':
  68.           /* set table */
  69.           if (optind + 1 < argc)
  70.         add_a_table (argv[optind], argv[optind + 1]);
  71.           break;
  72.         case 'd':
  73.           /* delete table */
  74.           if (optarg)
  75.         delete_a_table (optarg);
  76.           break;
  77.         default:
  78.           break;
  79.         }
  80.     }
  81.       else
  82.     {
  83.       /* no opt */
  84.       if (argc > 1)
  85.         {
  86.           /* display table coresspond to host */
  87.           print_a_table (argv[1]);
  88.         }
  89.       else
  90.         {
  91.           printf ("usage:    arp hostname\n");
  92.           printf ("    arp -a\n");
  93.           printf ("    arp -d hostname\n");
  94.           printf ("    arp -s hostname hardware-address\n");
  95.         }
  96.     }
  97.     }
  98.   return;
  99. }
  100.  
  101. /************************************************
  102.  *                        *
  103.  ************************************************/
  104. void
  105. print_a_table (char *src)
  106. {
  107.   long ip;
  108.   char buff[32], *p, *hostname;
  109.   char ip_addr[32];
  110.   struct hostent *h;
  111.  
  112.   if (!isipaddr (src))
  113.     {
  114.       h = gethostbyname (src);
  115.       if (h)
  116.     ip = *(long *)h->h_addr;
  117.     }
  118.   else
  119.     {
  120.       ip = a2n_ipaddr (src);
  121.       h = gethostbyaddr ((char *)&ip, sizeof (long), AF_INET);
  122.       if (h)
  123.     {
  124.       char *q, *r;
  125.  
  126.       q = malloc (strlen (h->h_name) + 1);
  127.       if (!q)
  128.         hostname = "?";
  129.       else
  130.         {
  131.           strcpy (q, h->h_name);
  132.           r = strchr (q, '.');
  133.           if (r)
  134.         {
  135.           if (!strcmp (r + 1, get_domain_name ()))
  136.             *r = '\0';
  137.         }
  138.           hostname = q;
  139.         }
  140.     }
  141.       else
  142.     hostname = "?";
  143.     }
  144.   if (ip)
  145.     {
  146.       n2a_ipaddr (ip, ip_addr);
  147.       p = search_arp_table (ip, 32, buff);
  148.       if (p)
  149.     {
  150.       printf ("%s (%s) at %s\n", src, ip_addr, buff);
  151.     }
  152.       else
  153.     {
  154.       /* no-entry */
  155.       printf ("%s (%s) -- no entry\n", src, ip_addr);
  156.     }
  157.     }
  158.   else
  159.     {
  160.       /* unknown host */
  161.       printf ("arp: %s: Host name look up failure\n", src);
  162.     }
  163.  
  164.   return;
  165. }
  166.  
  167. /************************************************
  168.  *                        *
  169.  ************************************************/
  170. static void
  171. display_all_table (void)
  172. {
  173.   long *addrs;
  174.   int len, i;
  175.  
  176.   addrs = get_arp_array (&len);
  177.   if (!addrs)
  178.     return;
  179.   for (i = 0; i < len; i++)
  180.     {
  181.       char *hostname;
  182.       char buff[32];
  183.       char ip_addr[32];
  184.       long ip;
  185.       struct hostent *h;
  186.  
  187.       ip = addrs[i];
  188.       h = gethostbyaddr ((char *)&ip, sizeof (long), AF_INET);
  189.       if (h)
  190.     {
  191.       char *q, *r;
  192.  
  193.       q = malloc (strlen (h->h_name) + 1);
  194.       if (!q)
  195.         hostname = "?";
  196.       else
  197.         {
  198.           strcpy (q, h->h_name);
  199.           r = strchr (q, '.');
  200.           if (r)
  201.         {
  202.           if (!strcmp (r + 1, get_domain_name ()))
  203.             *r = '\0';
  204.         }
  205.           hostname = q;
  206.         }
  207.     }
  208.       else
  209.     hostname = "?";
  210.  
  211.       n2a_ipaddr (ip, ip_addr);
  212.       search_arp_table (ip, 32, buff);
  213.       if (!hostname)
  214.     hostname = "?";
  215.       printf ("%s (%s) at %s\n", hostname, ip_addr, buff);
  216.     }
  217.   free (addrs);
  218.   return;
  219. }
  220.  
  221. /************************************************
  222.  *                        *
  223.  ************************************************/
  224. static void
  225. add_a_table (char *ipaddr, char *hwaddr)
  226. {
  227.   char buff[256];
  228.   long ip;
  229.   route *rt;
  230.   iface *IF;
  231.  
  232.   if (!isipaddr (ipaddr))
  233.     {
  234.       struct hostent *h;
  235.  
  236.       h = gethostbyname (ipaddr);
  237.       if (h)
  238.     ip = *(long *)h->h_addr;
  239.       else
  240.     ip = 0;
  241.     }
  242.   else
  243.     ip = a2n_ipaddr (ipaddr);
  244.  
  245.   if (!ip)
  246.     {
  247.       printf ("arp: %s -- Host name look up failure\n", ipaddr);
  248.       return;
  249.     }
  250.  
  251.   rt = rt_lookup (ip);
  252.   if (!rt || rt->gateway || !rt->iface)
  253.     {
  254.       printf ("arp: %s -- Direct route dosen't exsists\n", ipaddr);
  255.       return;
  256.     }
  257.  
  258.   IF = rt->iface;
  259.   if (IF->sscan)
  260.     {
  261.       if (IF->sscan (hwaddr, buff))
  262.     {
  263.       printf ("arp: %s Invalid hardware address\n", hwaddr);
  264.       return;
  265.     }
  266.     }
  267.   else
  268.     {
  269.       printf ("arp: Unable to convert hardware address,\n"
  270.           "    because iface can't handle it.\n");
  271.       return;
  272.     }
  273.  
  274.   add_arp_table (ip, buff);
  275.  
  276.   return;
  277. }
  278.  
  279. /************************************************
  280.  *                        *
  281.  ************************************************/
  282. static void
  283. delete_a_table (char *ipaddr)
  284. {
  285.   long ip;
  286.  
  287.   if (!isipaddr (ipaddr))
  288.     {
  289.       struct hostent *h;
  290.       h = gethostbyname (ipaddr);
  291.       if (h)
  292.     ip = *(long *)h->h_addr;
  293.       else
  294.     ip = 0;
  295.     }
  296.   else
  297.     ip = a2n_ipaddr (ipaddr);
  298.  
  299.   if (ip)
  300.     delete_arp_table (ip);
  301.   else
  302.     printf ("arp: %s -- Host name look up failure\n", ipaddr);
  303.  
  304.   return;
  305. }
  306.  
  307.